public class StringMemoryAlloc{
    public static void main(String[] args){
        
        // 关于String初始化的方式不同，内存分配不同
        
        // "hello world"分配在方法区的常量池内
        String str0 = "hello world";        
        
        // str1首先在堆内分配一个空字符串内存，然后引用值变更为"hello world"的引用，与str0相同
        String str1 = new String();
        str1 = "hello world";
        
        // str2在堆内分配内存，"hello world"在堆内分配内存
        String str2 = new String("hello world");
        
        // new String()首先在堆内分配内存，然后调用intern()方法，在常量池内分配"hello world"内存，如果存在，则直接引用
        String str3 = new String("hello world").intern();
        
        // str4也是在堆内
        char[] chArr0 = new char[]{'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'};
        String str4 = new String(chArr0);
        
        System.out.println(str0 == str1);
        System.out.println(str0 == str2);
        System.out.println(str0 == str3);
        System.out.println(str0 == str4);                
        
    }
}